package com.yuexunxinxi.carefree.controller;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yuexunxinxi.carefree.entity.AQuest;
import com.yuexunxinxi.carefree.entity.vo.AQuestVo;
import com.yuexunxinxi.carefree.filter.SkipLogin;
import com.yuexunxinxi.carefree.service.a_quest.AQuestService;
import com.yuexunxinxi.carefree.utils.R;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;

/**
 * 作者: 李咨辰
 * 文件名: AQuestController.java
 * 路径: com.yuexunxinxi.carefree.controller
 * 时间: 2024-10-14 14:50
 * 版本: 1.0
 * 描述: TODO 任务
 **/
@RestController
@RequestMapping("/quest")
public class AQuestController {
    /**
     * 调用业务层
     */
    @Resource
    private AQuestService aQuestService;

    /**
     * 获取条数
     *
     * @param sortId 分类编号
     * @return 条数
     */
    @SkipLogin
    @GetMapping("/getQuestTotal")
    public R getQuest(int sortId) {
        Long total = aQuestService.getQuestTotal(sortId);
        return R.ok().put("data", total);
    }

    /**
     * 获取首页数据
     *
     * @param sortId   分类编号
     * @param current  当前页
     * @param pageSize 每页条数
     * @return 首页数据
     */
    @SkipLogin
    @GetMapping("/getQuestByHomeList")
    public R getQuestByHomeList(int sortId, int current, int pageSize) {
        List<AQuest> questByHomeList = aQuestService.getQuestByHomeList(sortId, current, pageSize);
        return R.ok().put("data", questByHomeList);
    }

    /**
     * 添加需求
     *
     * @param aQuest 用户上传的需求
     * @return 添加结果
     */
    @PostMapping("/addQuest")
    public R addQuest(@RequestBody AQuest aQuest) {
        System.out.println(aQuest);
        int i = aQuestService.addQuest(aQuest);
        if (i == 0) {
            return R.ok().put("data", "添加失败");
        }
        return R.ok().put("data", "添加成功");
    }

    /**
     * 根据任务编号和当前登录用户获取任务信息
     *
     * @param questId 任务编号
     * @param userId  用户编号
     * @return 任务详情
     */
    @SkipLogin
    @GetMapping("/getQuestByQuestIdAndUserId")
    @JsonSerialize(using = ToStringSerializer.class)
    public R getQuestById(Long questId, Long userId) {
        AQuestVo aQuestVo = aQuestService.getQuestByQuestIdAndUserId(questId, userId);
        return R.ok().put("data", aQuestVo);
    }

    /**
     * 查询任务列表(地图)
     *
     * @param city 城市
     * @return 任务列表
     */
    @SkipLogin
    @GetMapping("/getQuestMapList")
    public R getMapList(String city) {
        List<AQuestVo> aQuestList = aQuestService.getMapList(city);

        return R.ok().put("data", aQuestList);
    }


    /**
     * 查询任务列表(个人中心)
     *
     * @param userId 发起人编号
     * @return 发起人任务列表
     */
    @SkipLogin
    @GetMapping("/getInitiatorList")
    public R getInitiatorList(String userId, int current, int pageSize) {
        List<AQuestVo> aQuestList = aQuestService.getInitiatorList(userId, current, pageSize);
        return R.ok().put("data", aQuestList);
    }

    /**
     * 获取发起人任务总数
     *
     * @param userId 发起人编号
     * @return 发起人任务总数
     */
    @SkipLogin
    @GetMapping("/getInitiatorTotal")
    public R getInitiatorTotal(String userId) {
        Integer total = aQuestService.getInitiatorTotal(userId);
        return R.ok(total);
    }

    /**
     * 查询任务列表(待完成订单)
     *
     * @param userId        接收人编号
     * @param publishStatus 发布状态
     *                      return 接收人任务列表
     */
    @SkipLogin
    @GetMapping("/getReceiverList")
    public R getReceiverList(String userId, Integer publishStatus) {
        if (userId.equals("")) {
            return R.error("请先登录!");
        }
        List<AQuestVo> aQuestList = aQuestService.getReceiverList(userId, publishStatus);
        return R.ok().put("data", aQuestList);
    }

    /**
     * 接取订单
     *
     * @param argument 参数
     * @return 成功200
     */
    @SkipLogin
    @PostMapping("/receive")
    public R receive(@RequestBody HashMap<String, Long> argument) {
        if (!(argument.get("userId") == null || argument.get("questId") == null)) {
            return aQuestService.receive(argument.get("userId"), argument.get("questId"));
        }
        return R.error("参数错误");
    }

    /**
     * 更新任务状态
     *
     * @param aQuest 任务实体
     * @return 更新结果
     */
    @PostMapping("/updateQuestStatus")
    public R updateQuestStatus(@RequestBody AQuest aQuest) {
        boolean b = aQuestService.updateQuestStatus(aQuest.getId(), aQuest.getPublishStatus());
        return R.ok(b);
    }
}
